Existential Type
code:swift
func f(arg1:T):I1{
/* ... */
}
返される関数の戻り値の型は、インタフェースI1を型の上界とする。
つまり、関数fから返されるインスタンスはI1を実装していなければならない。
このように指定したプロトコル型I1のことをExistential Typeという。
code:swift
var x:I1 = S()
実行中xの型は任意のI1実装型(any I1)をとり得る。
Opaque Typeの場合、実行中xの型はある一つの定まったI1実装型(some I1/exist I1)をとり得る。
Swiftではこの型を実現するために、Existential Containerというインスタンスにデータをいれて扱う。
このExistential Containerのおかげで、実行中にどんなI1実装型のインスタンスを入れられても対応できる。
しかしインスタンスに入れたせいでメモリやアクセス等にオーバーヘッドがある
Swiftの標準ライブラリではExistential Typeは殆ど使用されていない。
=> Opaque Type
参照
Swift 5.1 に導入される Opaque Result Type とは何か